#include<iostream>
#include<functional>
#include<vector>
#include<memory>
#include"err.hpp"
#include"selectserver.hpp"
using namespace std;
//using namespace Select_sv;

// static void Usage(string proc)
// {
//     cerr<<"Usage:\n\t"<<proc<<" port "<<"\n\n";
// }

// string resp(const string& s)
// {
//     return s;
// }

// int main(int argc,char* argv[])
// {
//     // if(argc!=2)
//     // {
//     //     Usage(argv[0]);
//     //     exit(USAGE_ERR);
//     // }

//     unique_ptr<SelectServer> selsv(new SelectServer(resp));
//     selsv->initServer();
//     selsv->Start();
    
//     return 0;
// }








#include"until.hpp"
using func_t =function<void()>;//定义一个仿函数，返回值为void，无参
using namespace std;

#define INIT(v)\
do             \
{              \
v.push_back(Print_log);\
v.push_back(Download);\
}while(0)


#define EXEC(v)\
do             \
{              \
for(auto const& cbs: v)\
{              \
    cbs();     \
}              \
}while(0)

fd_set readset;
int main()
{
 setNonBlock(0);//将输入缓冲区的IO行为设置为非阻塞

    vector<func_t> v;
    INIT(v);
    char buffer[1024];//设置缓冲区
    while(true)
    {
        // printf("请输入>>> ");
        // fflush(stdout);//刷新显示屏缓冲区
        ssize_t i= read(0,buffer,sizeof(buffer)-1);//从文件描述符为0（键盘）开始读，读到buffer缓冲区中
        if(i>0)
        {
            buffer[i-1]=0;
            cout<<"echo# "<<buffer<<endl;
        }else if(i==0)
        {
            cout<<"read end"<<endl;
            break;
        }else
        {
            cout<<"i: "<<i<<endl;
            cout<<"EAGAIN: "<<EAGAIN<<endl;
            cout<<"EWOULDBLOCK: "<<EWOULDBLOCK<<endl;
            
        // //不输入的话，返回值也是-1，但错误码会被设置为EAGAIN或EWOULDBLOCK
        //     if(errno==EAGAIN||errno==EWOULDBLOCK)
        //     {
        //         cout<<"i am not wrong,just non data,try again"<<endl;
        //         EXEC(v);//因为是非阻塞，当进入该作用域时说明用户没有输入，此时可以执行其他任务
        //     }else if(errno==EINTR)
        //     {
        //         continue;
        //     }else
        //     {
        //         //此时发生错误，打印返回值及其错误码信息
        //         cout<<"i: "<<i<<" errno: "<<strerror(errno)<<endl;
        //         break;
        //     }

        }
        sleep(1);
    }

    return 0;
}